/**
 * Created by apple on 2017/6/8.
 */

var express = require('express');
var router = express.Router();

var AppMngRouter = module.exports;
var AdminToken = require('../db/user_tokens.js');
var appAdmin = require('../dao/app_admin.js');

var multiparty = require('multiparty');
var util = require('util');
var fs = require('fs');

/**
 * 系统管理员添加产品
 * @param  token 管理员
 *         url/app_management/addApp
 */
AppMngRouter.addApp = function(req, res) {
    var par = paramAll(req);
    par.secret = '*'; //先随便给一个，而后在checkParAndAdm中会随机生成
    router.checkParAndAdm(par,false,function (err,errCode,appInfo) {

        if(err){
            res.json(new ERR(err, errCode));
            return;
        }

        appAdmin.addApp(appInfo,function (err) {
            if(err){
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }

            res.json(new PKG(appInfo));

        });
    });

}
router.post('/addApp', AppMngRouter.addApp);


/**
 * 系统管理员、产品管理员修改产品属性
 * @param  token 管理员
 *         url/app_management/updateApp
 */
AppMngRouter.updateApp = function(req, res) {
    var par = paramAll(req);

    router.checkParAndAdm(par,true,function (err,errCode,appInfo) {

        if(err){
            res.json(new ERR(err, errCode));
            return;
        }

        appAdmin.updateApp(appInfo,function (err,result) {
            if(err){
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));

        });
    });

}
router.post('/updateApp', AppMngRouter.updateApp);


/**
 * 系统管理员查询产品列表，产品管理员查询自己产品列表
 * @param  token 管理员
 *         url/app_management/appList
 */
AppMngRouter.appList = function(req, res) {
    var par = paramAll(req);

    if(!par.token){
        res.json(new ERR('token不为空', 400));
        return;
    }


    AdminToken.checkAdminLogin(par.token,par.app_sid, function (err,errCode, adminInfo) {
        if (err) {
            res.json(new ERR(err, errCode));
            return;
        }

        appAdmin.appList(par,function (err,result) {
            if(err){
                res.json(new ERR(err, 400));
                return;
            }
            var list = {
                appList: result
            };
            res.json(new PKG(list));
        });

    });


}
router.post('/appList', AppMngRouter.appList);




/**
 * 系统管理员、产品管理员查看产品详情
 * @param  token 管理员
 *         url/app_management/appDetail
 */
AppMngRouter.appDetail = function(req, res) {
    var par = paramAll(req);

    if(!par.token){
        res.json(new ERR('token不为空', 400));
        return;
    }

    if(!par.app_sid){
        res.json(new ERR('app_sid不为空', 400));
        return;
    }

    AdminToken.checkAdminLogin(par.token,par.app_sid, function (err,errCode, adminInfo) {
        if (err) {
            res.json(new ERR(err, errCode));
            return;
        }

        appAdmin.appDetail(par,function (err,result) {
            if(err){
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });

    });


}
router.post('/appDetail', AppMngRouter.appDetail);



/**
 * 系统管理员、产品管理员搜索产品用户
 * @param  token 管理员
 *         url/app_management/findUser
 */
AppMngRouter.findUsers = function(req, res) {
    var par = paramAll(req);

    if(!par.token){
        res.json(new ERR('token不为空', 400));
        return;
    }

    if(!par.app_sid){
        res.json(new ERR('app_sid不为空', 400));
        return;
    }

    AdminToken.checkAdminLogin(par.token,par.app_sid, function (err,errCode, adminInfo) {
        if (err) {
            res.json(new ERR(err, errCode));
            return;
        }

        appAdmin.findUsers(par,function (err,result) {
            if(err){
                res.json(new ERR(err, 400));
                return;
            }
            var user = {
                userList: result
            };
            res.json(new PKG(user));
        });

    });


}
router.post('/findUsers', AppMngRouter.findUsers);

/**
 * 抽取  校验请求的参数以及管理员权限
 * par 请求的参数
 * isAppAdm true 多检查是不是产品管理员  flase 只检查是不是系统管理员  分段检查减少代码执行
 * cb 返回
 *         url/app_management/updateApp
 */
router.checkParAndAdm = function (par,isAppAdm,cb) {


    if(!par.token){
        cb('token不为空',400);
        return;
    }

    if(!par.sid){
        cb('sid不为空',400);
        return;
    }

    AdminToken.checkLogin(par.token, function (err, adminInfo) {
        if (err) {
            cb(err,400);
            return;
        }

        if (!adminInfo) {
            cb('请先登录',403);
            return;
        }

        if(!adminInfo.isAdmin){
            cb('无权限',400);
            return;
        }

        //检查管理员权限
        if(isAppAdm == true){

            //检查是不是系统管理员或产品管理员
            var appAdminFlag = adminInfo.role.indexOf('adm_'+par.sid) >= 0;
            if(adminInfo.role.indexOf('admin') < 0 && appAdminFlag != true){
                cb('无权限',400);
                return;
            }

            //产品管理员无权限修改 产品管理员
            if(appAdminFlag && par.admin_id){
                cb('无权限',400);
                return;
            }

        }else {

            //检查是不是系统管理员
            if(adminInfo.role.indexOf('admin') < 0){
                cb('无权限',400);
                return;
            }

        }

        //检查参数par要修改或添加哪些  保证appInfo至少有一个字段
        var appInfo = {
            sid: par.sid
        };
        var parCount = 0;
        if(par.name){
            appInfo.name = par.name;
            parCount ++;
        }
        if(par.secret){
            appInfo.secret = randomString(16);
            parCount ++;
        }
        if(par.icon){
            appInfo.icon = par.icon;
            parCount ++;
        }
        if(par.comment){
            appInfo.comment = par.comment;
            parCount ++;
        }
        if(par.user_count){
            appInfo.user_count = par.user_count;
            parCount ++;
        }
        if(par.mng_items){
            appInfo.mng_items = par.mng_items;
            parCount ++;
        }
        if(par.vip_items){
            appInfo.vip_items = par.vip_items;
            parCount ++;
        }
        if(par.agent_items){
            appInfo.agent_items = par.agent_items;
            parCount ++;
        }
        //如果是修改产品，一定要带上修改的字段
        if(isAppAdm == true && parCount == 0){
            cb('无效参数',400);
            return;
        }

        if(isAppAdm == true){
            appInfo.account = adminInfo.account;
            appInfo.adm_uid = adminInfo.uid;
        }

        cb(null,0,appInfo);
    });

}


//产生随机英文字符
function randomString(len) {
    len = len || 32;
    var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
    var maxPos = $chars.length;
    var pwd = '';
    for (var i = 0; i < len; i++) {
        pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return pwd;
}


//添加新app
router.post('/addIcon',function (req,res) {

    router.addOrUpdateApp(req,false,function (err,errCode,appInfo) {
        if(err){
            res.json(new ERR(err, errCode));
            return;
        }
        //添加App
        appAdmin.addApp(appInfo,function (err) {
            if(err){
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(appInfo));
        });
    })

});

//修改app
router.post('/updateIcon',function (req,res) {

    router.addOrUpdateApp(req,true,function (err,errCode,appInfo) {
        if(err){
            res.json(new ERR(err, errCode));
            return;
        }
        //添加App
        appAdmin.updateApp(appInfo,function (err,result) {
            if(err){
                console.log(err);
                res.json(new ERR(err, 400));
                return;
            }
            res.json(new PKG(result));
        });
    })

});

//isUpdate  true ：修改   false 添加（添加只有系统管理员）
router.addOrUpdateApp = function (req,isUpdate,cb) {

    //生成multiparty对象，并配置上传目标路径
    var form = new multiparty.Form({uploadDir: './public/appIcons/'});

    //上传完成后处理
    form.parse(req,function (error,fields,files) {
        console.log(files);


        var inputFile = {};
        if(!files.file){
            cb('参数有误',400,null);
            return;
        }
        if(files.file){
            inputFile = files.file[0];
        }
        var uploadedPath = './' + inputFile.path;

        //参数格式转换
        var par = {};
        for(var p in fields){
            if(p[0]){
                par[p] = fields[p][0];
            }
        }

        par.icon = '*'; //为了通过验证先给一个任意值，不影响后续修改
        if(isUpdate == false) {
            par.secret = '*';  //创建scret
        }

        if(error){//图片上传失败不影响创建
            console.log('parse error: ' + err);
            fs.unlink(uploadedPath,function (err) {});//删除上传的文件
            delete par.icon;
            if(isUpdate == true){
                cb('上传图片失败',400,null);
                return;
            }
        }

        router.checkParAndAdm(par,isUpdate,function (err,errCode,appInfo) {

            if(err){//参数有误
                cb(err,errCode,null);
                //删除上传的文件
                fs.unlink(uploadedPath,function (err) {});
                return;
            }

            //参数正确   更换图片路径
            var dstPath = './public/appIcons/' + fields.sid + '_icon.jpg';

            //删除已上传的原图
            fs.unlink(dstPath,function (err) {

                //重命名为真实文件名
                fs.rename(uploadedPath,dstPath,function (err) {

                    if(err){
                        console.log(err);
                        console.log(uploadedPath);
                        var index = inputFile.path.indexOf('appIcons/');
                        appInfo.icon = '/' + inputFile.path.substr(index,inputFile.path.length - index);
                    }else {
                        appInfo.icon = '/appIcons/' + fields.sid + '_icon.jpg';
                    }

                    cb(null,0,appInfo);

                });

            });


        });

    });
}



module.exports = router;